/**
 * Comments控制器模块
 */

const express = require("express");

const util = require("../common/util");
/**
 * @typedef {CourseDB}
 */
const CommentsDB = require("../model/sqlite/comments");

/**
 * 获取指定ID的评论信息
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function find(req, res) {
    (async function () {
        let db = CommentsDB.getInstance();
        await db.connect();
        let result = await db.find(req.params.id);
        //await db.close();
        util.logFormat(`获取【${req.params.id}】评论信息%O`, result);
       res.json(util.FormatJSONData(200, `获取评论信息【${req.params.id}】`,result));
    })().catch(err => {
       util.err(err);
       res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
   });
}

/**  
* 新增评论信息  
* @param {express.Request} req 请求  
* @param {express.Response} res 响应  
*/  
function add(req, res) {  
   (async function () {    
           let comments = { 
               userId: req.session.user.id,  
               courseId: req.body.courseId,   
               parentCommentId: req.body.parentCommentId,  
               content: req.body.content,  
               createdAt: Date.now(),
               updatedTime: Date.now()   
           };  
 
           // 其他字段校验和默认值设置可以根据需要添加  
 
           let db = CommentsDB.getInstance();  
           await db.connect(); // 假设connect()返回Promise  
 
           let result = await db.add(comments); // 假设add()方法返回评论的ID  
 
           util.log(`新增评论信息：lastID->${result}`);  
           res.json(util.FormatJSONData(201, '评论添加成功111', { lastID: result }));  
 
       })().catch(err => {
           util.err(err);
           res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
       }); 
   }

   /**
* 删除评论信息
* @param {express.Request} req  请求
* @param {express.Response} res  响应
*/
function remove(req, res) {
   (async function () {
       //FIXME:数据合法性校验
       let commentId = req.params.id;
       let db = CommentsDB.getInstance();
       await db.connect();
       let result = await db.remove(commentId);
       //await db.close();
       util.log(`删除评论信息：changes->${result}`);
       res.json(util.FormatJSONData(204, `删除评论信息`, {changes: result}));
   })().catch(err => {
       util.err(err);
       res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
   });
}

/**
* 修改评论信息
* @param {express.Request} req 请求
* @param {express.Response} res 响应 
*/
function update(req, res){
   (async function(){
        //FIXME:req.body的数据安全性校验（需要做）
        let comments = {
           id: req.params.id,  
           parentCommentId: req.body.parentCommentId,
           content: req.body.content,
           updatedTime: Date.now(),
       };

       //2.访问数据
       let db = CommentsDB.getInstance();
       await db.connect();
       //FIXME:插入数据前，考虑校验是否已存在ISBN
       let result = await db.update(comments);
       
       //3.处理输出数据
       //await db.close():
       util.log(`更新评论信息:changes->${result}`);
       res.json(util.FormatJSONData(200, `更新评论信息`,{changes: result}));
   })().catch(err => {
       util.err(err);
       res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
   });
}

/**
* 获取指定课程的评论总数
* @param {express.Request} req 请求
* @param {express.Response} res 响应 
*/
function getCount(req, res){
   (async function(){
       //FIXME:数据合法性校验
        //2.访问数据
        let courseId=req.query.course_id? req.query.course_id:-1;
        let db = CommentsDB.getInstance();
        await db.connect();
        let result = await db.getCount(courseId);
        
        //3.处理输出数据
        //await db.close():
        util.log(`获取指定课程:【${courseId}】评论总数：${result}`);
        res.json(util.FormatJSONData(200, `获取指定课程的评论总数`,result));
   })().catch(err => {
       util.err(err);
       res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
   });
};

/**
 * 获取所有的评论总数
 * @param {express.Request} req  请求
 * @param {express.Response} res  响应
 */
function getCountAll(req, res) {
    (async function () {
        // 获取CommentsDB的实例
        let db = CommentsDB.getInstance();
        // 连接数据库
        await db.connect();
        // 调用数据库的getCount方法获取订单总数
        let result = await db.getCountAll();
        //await db.close();
        util.log(`获取所有的评论总数：${result}`);
        // 将结果以JSON格式返回给客户端
        res.json(util.FormatJSONData(200, `获取所有的评论总数`, result));
    })().catch(err => {
        console.log(err);
        util.err(err);
        res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
    });
}

/**
* 获取评论列表信息
* @param {express.Request} req 请求
* @param {express.Response} res 响应 
*/
function findAll(req, res){
   (async function(){
       //1.处理输入的数据
       //FIXME：输入数据的正确性校验，一致性校验，完整性校验
       let limit = req.query.limit ? req.query.limit : -1;
       let offset = req.query.offset ? req.query.offset : -1;
       //2.访问数据
       let db = CommentsDB.getInstance();
       await db.connect();
       let result = await db.findAll(limit, offset);
       
       //3.处理输出数据
       //await db.close():
       util.logFormat(`获取评论信息列表%O`, result);
       res.json(util.FormatJSONData(200, `获取评论信息列表`,result));
   })().catch(err => {
       util.err(err);
       console.log(err);
       res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
   });
}

/**
* 更新评论有用
* @param {express.Request} req 请求
* @param {express.Response} res 响应 
*/
function updateUseful(req, res){
   (async function(){
        //FIXME:req.body的数据安全性校验（需要做）
        let id = req.params.id;

       //2.访问数据
       let db = CommentsDB.getInstance();
       await db.connect();
       //FIXME:插入数据前，考虑校验是否已存在ISBN
       let result = await db.updateUseful(id);
       
       //3.处理输出数据
       //await db.close():
       util.log(`更新评论有用:changes->${result}`);
       res.json(util.FormatJSONData(200, `更新评论有用`,{changes: result}));
   })().catch(err => {
       util.err(err);
       res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
   });
}

/**
* 更新评论无用
* @param {express.Request} req 请求
* @param {express.Response} res 响应 
*/
function updateUseless(req, res){
   (async function(){
        //FIXME:req.body的数据安全性校验（需要做）
        let id = req.params.id;

       //2.访问数据
       let db = CommentsDB.getInstance();
       await db.connect();
       //FIXME:插入数据前，考虑校验是否已存在ISBN
       let result = await db.updateUseless(id);
       
       //3.处理输出数据
       //await db.close():
       util.log(`更新评论无用:changes->${result}`);
       res.json(util.FormatJSONData(200, `更新评论无用`,{changes: result}));
   })().catch(err => {
       util.err(err);
       res.json(util.FormatJSONData(500,"服务器发生意外情况，无法完成请求！"));
   });
}




module.exports = {
   find,
   add,
   remove,
   update,
   getCount,
   findAll,
   updateUseful,
   updateUseless,
   getCountAll,
};